#include <iostream>
#include <vector>
using namespace std;

const int N = 5e5 + 5;
const int LOG = 20;
vector<int> tr[N];
int depth[N];       // 节点深度（根节点深度为1）
int up[N][LOG];      // 父节点数组（记录每个节点的直接祖先）

// 递归计算深度和父节点（根节点 up 为 -1）
void dfs(int u, int p) {
    up[u][0] = p;
    depth[u] = (p==-1 ? 1 : depth[p]+1);
    for(int i=1; i<LOG; i++) {
        up[u][i] = (up[u][i-1]==-1 ? -1 : up[up[u][i-1]][i-1]);
    }
    for(int v : tr[u])
        if(v != p)  dfs(v, u);
}

int lca(int u, int v) {
    if(depth[u] < depth[v]) swap(u, v);
    for(int i=LOG-1; i>=0; i--) { // 最大限度向上跳
        if(depth[u] - (1 << i) >= depth[v])
            u = up[u][i];
    }
    if(u == v)  return u;
    for(int i=LOG-1; i>=0; i--) {
        if(up[u][i] != up[v][i]) { // 挪到不是共同祖先的那一位
            u = up[u][i];
            v = up[v][i];
        }
    }
    return up[u][0]; // 不是共同祖先的父亲就是最后一个共同的祖先
}

int main() {
    int n, m, root;
    cin >> n >> m >> root;
    
    // 建树（无向树，双向存边）
    for (int i = 1; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        tr[u].push_back(v);
        tr[v].push_back(u);
    }
    
    // 初始化深度和父节点（根节点的父节点为-1，深度为1）
    dfs(root, -1);
    
    // 处理 m 次查询
    while (m--) {
        int u, v;
        cin >> u >> v;
        cout << lca(u, v) << endl;
    }
    
    return 0;
}